package koby99;

import java.io.ObjectInputStream.GetField;

public class J18_OOP4 {

	// static
	// 일반적으로 객체를 생성하려면
	// 생성자를 사용해야함
	// 하지만, 생성자 없이도 객체를 바로 사용할 수도 있음
	// static 예약어를 멤버변수나
	// 메서드에 사용하면 객체생성 없이
	// 바로 클래스를 사용할 수 있음

	// static 로 선언된 멤버 변수는
	// 클래스명.멤버변수 형태로 사용
	// static 로 선언된 메서드는
	// 클래스명.메서드 형태로 사용
	// static 으로 선언된 멤버변수를
	// 클래스 변수라고 부르기도 함
	// 이것과 유사하게 C에서는 전역변수라고 함
	
	// static으로 선언된 멤버변수는 maib() 메서드가
	// 호출되기 전에 먼저 메모리에 변수공간이 생성됨
	// 반면에 객체는 main() 메서드가 호출되고
	// 해당 클래스의 생성자기 호출되어야만 변수공간이 생성
	
	// OOP 작성기법1
	// 프로그램 작성시 클래스는 용도(값,처리)에 따라 
	// 최소 2개이상으로 나눠 작성한는 것을 추천
	// 값만을 저장하는 클래스 : value object 클래스
	// 값을 받아서 처리만 하는 : service 클래스
	
	// 인수전달방식
	
	public static void main(String[] args) {
	 Rent r20131107001 = new Rent();
	 r20131107001.rentno = 351;  //대여번호
	 r20131107001.bookno = 8746; //대여한 대상 번호
	 r20131107001.memberno = 68; //대여한 사람 번호
	 r20131107001.showRentInto();//대여정보 출력
	
	
	// static 으로 선언된 클래스 사용
	StaticRent.rentno = 654;
	StaticRent.bookno = 1234567;
	StaticRent.memberno = 5467;
	StaticRent.showRentInto();
			
	// 성적데이터 초기화
	SungJuk sj = new SungJuk();
	sj.kor = 78;
	sj.eng = 89;
	sj.mat = 88;
//	sj.tot = sj.kor + sj.eng + sj.mat; 이것보다
	sj.tot = sj.showTotal();
	//이게 더 간편 즉, 메소드를 이용하면 간결하고 간단해지는 점이 장점
	
	// 성적데이터 초기화 2
	SungJukVO sino = new SungJukVO(88,54,75);
	SungJukService s = new SungJukService();
	sino.tot = s.get2(sino.kor, sino.mat, sino.eng);
	// 생성자를 쓰지 않고 메서드 호출
	sino.tot = SungJukService.get(sino.kor, sino.mat, sino.eng);
	System.out.println(sino.tot);
	
}
}

class Rent { //대여
	int rentno;
	int bookno;
	int memberno;
	
	//대여정보 출력 showRentInto
	void showRentInto(){
		System.out.println(rentno);
		System.out.println(bookno);
		System.out.println(memberno);
	}
}

class StaticRent { //객체생성없이  클래스 사용
	static int rentno;
	static int bookno;
	static int memberno;
	String rentdata;
	
	//대여정보 출력 showRentInto
	static void showRentInto(){
		System.out.println(rentno);
		System.out.println(bookno);
		System.out.println(memberno);
//		System.out.println(rentdata); //오류발생
		// static 메서드에서는 비 static 변수는 사용이 불가하다.
		// 하지만, rentdata를 사용하고 싶다면
		StaticRent sr = new StaticRent();
		System.out.println(sr.rentdata);
	}
}

class SungJuk {
	int kor;
	int mat;
	int eng;
	int tot;
	
	public SungJuk(){}
	public SungJuk(int kor, int eng, int mat){
		this.kor = kor;
		this.eng = eng;
		this.mat = mat;
	}
	int showTotal(){return kor+eng+mat;}
			
}
//성적클래스 : 성적에 관련된 데이터만 넣자.
// 즉, 멤버변수만 존재하고 그것을 처리하는 메서드는 없음
// 값만 저장하는 클래스[보통 VO라고 붙임 
class SungJukVO {
	String neme;
	int kor;
	int mat;
	int eng;
	int tot;
	public SungJukVO(){	}
	public SungJukVO(int kor, int mat, int eng){
	 this.kor = kor;
	 this.eng = eng;
	 this.mat = mat;
			 
	}
}
// 성적 데이터에 대한 총점, 평균, 학점등을 
// 처리하는 클래스[보통 Service라는 이름을 붙임.]
class SungJukService {
	static int get(int kor, int mat, int eng){
		return kor + mat + eng;}
	int get2(int kor, int mat, int eng){
			return kor + mat + eng;
	}
}